/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.sadhar.sipp.perekamananggaranpendapatanbanpem;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import net.java.dev.eval.Expression;
import org.sadhar.errhandler.ClassAntiNull;
import org.sadhar.sia.common.ClassSession;
import org.sadhar.sia.framework.ClassApplicationModule;
import org.sadhar.sipp.posanggaranpendapatanunit.PosAnggaranPendapatanUnitDAO;
import org.sadhar.sipp.posanggaranpendapatanunit.PosAnggaranPendapatanUnitDAOImpl;
import org.sadhar.sipp.unkerja.UnKerja;
import org.sadhar.sipp.unkerja.UnKerjaDAO;
import org.sadhar.sipp.unkerja.UnKerjaDAOImpl;
import org.zkoss.zk.ui.Session;
import org.zkoss.zk.ui.Sessions;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zul.Button;
import org.zkoss.zul.Doublebox;
import org.zkoss.zul.Label;
import org.zkoss.zul.Listbox;
import org.zkoss.zul.Listcell;
import org.zkoss.zul.Listitem;
import org.zkoss.zul.Messagebox;
import org.zkoss.zul.Toolbarbutton;

/**
 *
 * @author hendro
 */
public class AnggaranPendapatanBanPemWnd extends ClassApplicationModule {

    private Label lblTahunAnggaran;
    private Listbox lstboxUnitKerja;
    private Label lblUnitKerja;
    private Listbox lstboxKomponenTanpaRumus;
    private Listbox lstboxKomponenHasil;
    private Label lblTotalAnggaran;
    private Listbox lstboxAnggaranBiaya;
    private Label lblTotalBiaya;
    private Button btnSimpan;
    private Button btnHitung;
    private AnggaranPendapatanBanPemDAO dao;
    private ClassSession session;
    private PosAnggaranPendapatanUnitDAO unitKerjaDAO;
    private Map<String, BigDecimal> variabel;
    private List<AnggaranPendapatanBanPem> dataToSave;
    private UnKerjaDAO unDAO;
    private Session sesi;
    public AnggaranPendapatanBanPemWnd() {
        dao = new AnggaranPendapatanBanPemDAOImpl();
        sesi = Sessions.getCurrent();
        session = (ClassSession) sesi.getAttribute("CURRENT_SESSION");
        variabel = new HashMap<String, BigDecimal>();
        unitKerjaDAO = new PosAnggaranPendapatanUnitDAOImpl();
        dataToSave = new ArrayList<AnggaranPendapatanBanPem>();
        unDAO = new UnKerjaDAOImpl();
    }

    public void onCreate() throws Exception {
        lblTahunAnggaran = (Label) getFellow("lblTahunAnggaran");
        lstboxUnitKerja = (Listbox) getFellow("lstboxUnitKerja");
        lblUnitKerja = (Label) getFellow("lblUnitKerja");
        lstboxKomponenTanpaRumus = (Listbox) getFellow("lstboxKomponenTanpaRumus");
        lstboxKomponenHasil = (Listbox) getFellow("lstboxKomponenHasil");
        lblTotalAnggaran = (Label) getFellow("lblTotalAnggaran");
        lstboxAnggaranBiaya = (Listbox) getFellow("lstboxAnggaranBiaya");
        lblTotalBiaya = (Label) getFellow("lblTotalBiaya");
        btnSimpan = (Button) getFellow("btnSimpan");
        btnHitung = (Button) getFellow("btnHitung");
        lblTahunAnggaran.setValue(session.getThnAnggaran());
        btnSimpan.setDisabled(true);
        btnHitung.setDisabled(true);
        loadUnitKerja();
        loadAnggaranPendapatanBanPem();

    }

    private void loadUnitKerja() throws Exception {
        lstboxUnitKerja.getItems().clear();
        for (Map map : unitKerjaDAO.listByIdPosPendapatanAndTahunAnggaran(5, session.getThnAnggaran())) {
            Listitem item = new Listitem();
            item.setValue(map);
            item.appendChild(new Listcell(map.get("nama_unit_kerja").toString()));
            lstboxUnitKerja.appendChild(item);
        }

    }
    private int idPosAnggaranPendapatanUnit;

    public void lstboxUnitKerjaOnSelect() throws Exception {
        Map m = (Map) lstboxUnitKerja.getSelectedItem().getValue();
        lblUnitKerja.setValue(m.get("nama_unit_kerja").toString());
        idPosAnggaranPendapatanUnit = Integer.valueOf(m.get("idPosAnggaranPendapatanUnit").toString());
        loadKomponenTanpaRumus();
        hitungKomponenOnClick();
        //loadAnggaranPendapatanBanPem();        
        if (lstboxUnitKerja.getItems().size() > 0) {
            btnHitung.setDisabled(false);
        }
    }
    private List<Map> listData = new ArrayList<Map>();

    public void loadKomponenTanpaRumus() throws Exception {
        lstboxKomponenTanpaRumus.getItems().clear();
        int no = 1;
        int id = 1;
        listData.clear();
        for (Map map : dao.listKomponen(session.getThnAnggaran())) {
            if (map.get("rumus").toString().equalsIgnoreCase("")) { //tanpa rumus
                Listitem item = new Listitem();
                item.setValue(map);
                item.appendChild(new Listcell(String.valueOf(no++)));
                if (map.get("isKomponenGaji").toString().equalsIgnoreCase("Y")) {
                    Map mp = dao.selectKomponenGaji(map.get("kodeKomponenGaji").toString());
                    item.appendChild(new Listcell(mp.get("NmKomponen").toString()));
                } else {
                    item.appendChild(new Listcell(map.get("komponenDiluarGaji").toString()));
                }
                Listcell cellAnggaran = new Listcell();
                Doublebox txtboxCellAnggaran = new Doublebox();
                txtboxCellAnggaran.setId("txtbox" + String.valueOf(id));
                listData.add(map);
                id++;
                //Map mp = (Map) lstboxUnitKerja.getSelectedItem().getValue();
                //System.out.println(map.get("idKomponen").toString()+" "+idPosAnggaranPendapatanUnit);
                Map mapAnggaran = dao.selectAnggaran(Integer.valueOf(map.get("idKomponen").toString()), idPosAnggaranPendapatanUnit);
                if (mapAnggaran.size() > 0) {
                    txtboxCellAnggaran.setValue(Double.valueOf(mapAnggaran.get("nominalPerBulan").toString()));
                } else {
                    txtboxCellAnggaran.setValue(0);

                }
                cellAnggaran.appendChild(txtboxCellAnggaran);
                item.appendChild(cellAnggaran);
                lstboxKomponenTanpaRumus.appendChild(item);
            }
        }
    }

    public void btnHitungOnClick() throws Exception {
        if (lstboxKomponenTanpaRumus.getItems().size() > 0) {
            btnSimpan.setDisabled(false);
        }
        hitungKomponenOnClick();
    }

    public void hitungKomponenOnClick() throws Exception {

        int id = 1;
        for (Map map : listData) {
            Doublebox nilai = (Doublebox) this.getFellow("txtbox" + id);
            variabel.put(map.get("alias").toString(), new BigDecimal(nilai.getValue()));
            id++;
        }
        dataToSave.clear();
        lstboxKomponenHasil.getItems().clear();
        int no = 1;
        double totalAnggaran = 0;
        for (Map map : dao.listKomponen(session.getThnAnggaran())) {
            if (map.get("rumus").toString().equalsIgnoreCase("")) { //tanpa rumus
                Listitem item = new Listitem();
                item.setValue(map);
                item.appendChild(new Listcell(String.valueOf(no++)));
                if (map.get("isKomponenGaji").toString().equalsIgnoreCase("Y")) {
                    Map mp = dao.selectKomponenGaji(map.get("kodeKomponenGaji").toString());
                    item.appendChild(new Listcell(mp.get("NmKomponen").toString()));
                } else {
                    item.appendChild(new Listcell(map.get("komponenDiluarGaji").toString()));
                }
                item.appendChild(new Listcell(variabel.get(map.get("alias").toString()) + ""));
                lstboxKomponenHasil.appendChild(item);
                totalAnggaran += Double.valueOf(variabel.get(map.get("alias").toString()).toPlainString());
                AnggaranPendapatanBanPem obj = new AnggaranPendapatanBanPem();
                obj.setIdKomponen(Integer.valueOf(map.get("idKomponen").toString()));
                //Map m = (Map) lstboxUnitKerja.getSelectedItem().getValue();
                obj.setIdPosAnggaranPendapatanUnit(idPosAnggaranPendapatanUnit);
                obj.setNominalPerbulan(Float.valueOf(variabel.get(map.get("alias").toString()).toPlainString()));
                dataToSave.add(obj);
            } else {
                Listitem item = new Listitem();
                item.setValue(map);
                item.appendChild(new Listcell(String.valueOf(no++)));
                if (map.get("isKomponenGaji").toString().equalsIgnoreCase("Y")) {
                    Map mp = dao.selectKomponenGaji(map.get("kodeKomponenGaji").toString());
                    item.appendChild(new Listcell(mp.get("NmKomponen").toString()));
                } else {
                    item.appendChild(new Listcell(map.get("komponenDiluarGaji").toString()));
                }
                Expression exp = new Expression(map.get("rumus").toString());
                BigDecimal hasil = new BigDecimal(0);
                try {
                    hasil = exp.eval(variabel);
                } catch (Exception ex) {
                    Messagebox.show("Variabel Tidak ditemukan: " + ex.getMessage(), "Pesan Kesalahan", Messagebox.OK, Messagebox.ERROR);
                    lstboxKomponenHasil.getItems().clear();
                    return;
                }
                item.appendChild(new Listcell(String.valueOf(hasil)));
                lstboxKomponenHasil.appendChild(item);
                totalAnggaran += Double.valueOf(hasil.toPlainString());
                AnggaranPendapatanBanPem obj = new AnggaranPendapatanBanPem();
                obj.setIdKomponen(Integer.valueOf(map.get("idKomponen").toString()));
                //Map m = (Map) lstboxUnitKerja.getSelectedItem().getValue();
                obj.setIdPosAnggaranPendapatanUnit(idPosAnggaranPendapatanUnit);
                obj.setNominalPerbulan(Float.valueOf(hasil.toPlainString()));
                dataToSave.add(obj);
            }
        }
        lblTotalAnggaran.setValue(ClassAntiNull.AntiNullDoubleCurrency(totalAnggaran));
    }

    public void btnSimpanOnClick() throws Exception {
        if (dataToSave.size() <= 0) {
            Messagebox.show("Tidak ada data yang akan disimpan", "Pesan Informasi", Messagebox.OK, Messagebox.INFORMATION);
            return;
        }
        for (AnggaranPendapatanBanPem obj : dataToSave) {
            if (dao.select(obj.getIdPosAnggaranPendapatanUnit(), obj.getIdKomponen()).size() <= 0) {
                dao.insert(obj);
            } else {
                dao.update(obj);
            }
        }
        btnSimpan.setDisabled(true);
        btnHitung.setDisabled(true);
        lstboxKomponenTanpaRumus.getItems().clear();
        lstboxKomponenHasil.getItems().clear();
        lblTotalAnggaran.setValue("........................");
        lblTotalBiaya.setValue("........................");
        loadAnggaranPendapatanBanPem();
    }
    //private UnKerjaDAO unDAO = new UnKerjaDAOImpl();

    private void loadAnggaranPendapatanBanPem() throws Exception {
        lstboxAnggaranBiaya.getItems().clear();
        double totalAnggaran = 0;
        int id = 1;
        //Map mp = (Map) lstboxUnitKerja.getSelectedItem().getValue();
        //List tmp = dao.list(Integer.valueOf(mp.get("idPosAnggaranPendapatanUnit").toString()), sesi.getThnAnggaran());
        //System.out.println(Integer.valueOf(mp.get("idPosAnggaranPendapatanUnit").toString()));
        //System.out.println(tmp.size());
        for (final Map map : dao.list(session.getThnAnggaran())) {
            Listitem item = new Listitem();
            item.setValue(map);
            item.appendChild(new Listcell(unDAO.select(map.get("kodeUnitKerja").toString()).getNamaUnitKerja()));
            if (map.get("isKomponenGaji").toString().equalsIgnoreCase("Y")) {
                Map mpx = dao.selectKomponenGaji(map.get("kodeKomponenGaji").toString());
                item.appendChild(new Listcell(mpx.get("NmKomponen").toString()));
            } else {
                item.appendChild(new Listcell(map.get("komponenDiluarGaji").toString()));
            }
            item.appendChild(new Listcell(ClassAntiNull.AntiNullFloatCurrency(map.get("nominalPerBulan"))));
            totalAnggaran += Double.valueOf(map.get("nominalPerBulan").toString());
            Listcell cellAksi = new Listcell();
            Toolbarbutton btnUbah = new Toolbarbutton();
            btnUbah.setId("btnBuah" + String.valueOf(id++));
            btnUbah.setLabel("[ubah]");
            btnUbah.addEventListener("onClick", new EventListener() {

                public void onEvent(Event arg0) throws Exception {
                    idPosAnggaranPendapatanUnit = Integer.valueOf(map.get("idPosAnggaranPendapatanUnit").toString());
                    UnKerja un = unDAO.select(map.get("kodeUnitKerja").toString());
                    lblUnitKerja.setValue(un.getNamaUnitKerja());
                    loadKomponenTanpaRumus();
                    hitungKomponenOnClick();
                    btnHitung.setDisabled(false);
                }
            });
            cellAksi.appendChild(btnUbah);
            item.appendChild(cellAksi);
            lstboxAnggaranBiaya.appendChild(item);
        }
        lblTotalBiaya.setValue(ClassAntiNull.AntiNullDoubleCurrency(totalAnggaran));
    }

    public void btnBatalOnClick() throws Exception {
        btnSimpan.setDisabled(true);
        btnHitung.setDisabled(true);
        loadUnitKerja();
        lblUnitKerja.setValue("........................");
        lstboxKomponenTanpaRumus.getItems().clear();
        lstboxKomponenHasil.getItems().clear();
        lstboxAnggaranBiaya.getItems().clear();
        lblTotalAnggaran.setValue("........................");
        lblTotalBiaya.setValue("........................");
        loadAnggaranPendapatanBanPem();
    }
}
